const en = {
  common: {
    save: 'Save',
    cancel: 'Cancel',
    ok: 'OK',
    on: 'On',
    off: 'Off',
    close: 'Close'
  },
  settings: {
    general: {
      title: 'General',
      language: 'Language',
      environmentListUrl: 'Environment List URL'
    },
    tabs: {
      general: 'General',
      node: 'Node',
      api: 'API',
      redis: 'Redis',
      other: 'Other',
      framework: 'Framework'
    },
    node: {
      delay: 'Node Delay (ms)',
      timeout: 'Node Timeout (ms)',
      reportUrl: 'Node Report URL',
      pythonPath: 'Python Path',
      pythonPathPlaceholder: 'Custom python path',
      delayPlaceholder: 'Enter delay (milliseconds)',
      timeoutPlaceholder: 'Enter timeout (milliseconds)',
      reportUrlPlaceholder: 'Enter report URL'
    },
    api: {
      host: 'API Host',
      port: 'API Port',
      tokenEnabled: 'Enable Token',
      token: 'Token',
      tokenPlaceholder: 'Enter token (optional)'
    },
    redis: {
      enabled: 'Enable Redis',
      host: 'Redis Host',
      port: 'Redis Port',
      password: 'Redis Password',
      passwordPlaceholder: 'Enter password (optional)',
      db: 'Redis DB',
      testConnection: 'Test Connection',
      connectSuccess: 'Redis connection successful!',
      readWriteSuccess: 'Redis read/write successful!',
      connectFailed: 'Redis connection failed, please check config!',
      connectionTestFailed: 'Redis connection test failed',
      notes: '• When enabled, Redis will be used for caching\n• If connection fails, in-memory cache will be used\n• A restart is required after changing config\n• Test connection before saving is recommended'
    },
    other: {
      noUi: 'Start without UI'
    },
    framework: {
      path: 'Framework Path',
      pathPlaceholder: 'Enter framework path'
    }
  },
  menubar: {
    project: 'Project',
    new: 'New Project',
    open: 'Open Project',
    close: 'Close Project',
    run: 'Run',
    start: 'Start',
    stop: 'Stop',
    debug: 'Debug Mode',
    tools: 'Tools',
    settings: 'Settings',
    rostool: 'Topics',
    env: 'Environments',
    simulation: 'Simulation',
    maptool: 'Map Tool',
    installExt: 'Install Extension',
    help: 'Help',
    documentation: 'Docs',
    about: 'About',
    docOpenTitle: 'Open Documentation',
    docOpenContent: 'Open the documentation in browser?'
  },
  layout: {
    versionWarning: 'System version is not recommended. Use {version}.'
  },
  projectExplorer: {
    confirmDeleteTitle: 'Confirm Delete',
    confirmDeleteContent: 'Delete "{name}"?',
    confirmRenameTitle: 'Confirm Rename',
    confirmRenameContent: 'Rename "{name}"?',
    deleteSuccess: 'Deleted successfully',
    newItemFile: 'file',
    newItemFolder: 'folder',
    newItemPlaceholderFile: 'New file',
    newItemPlaceholderFolder: 'New folder',
    renameSuccess: 'Renamed successfully',
    createFileSuccess: 'File created',
    createFolderSuccess: 'Folder created',
    openInExplorer: 'Open in Explorer',
    contextNewFile: 'New File',
    contextNewFolder: 'New Folder',
    contextRename: 'Rename',
    contextDelete: 'Delete'
  },
  simulationManager: {
    title: 'Simulation Manager',
    fetchListFailed: 'Failed to fetch simulation platforms',
    selectDirTitle: 'Select download directory',
    downloading: 'Downloading...',
    downloadProgress: 'Downloading...{progress}%',
    installDone: 'Installation completed',
    installFailed: 'Install failed: {msg}',
    manualSetDone: 'Launch script recorded, marked as installed',
    selectFileFailed: 'Select file failed',
    confirmStopTitle: 'Confirm to stop',
    confirmStopContent: 'Download is in progress, stop it?',
    stopped: 'Download stopped',
    stopFailed: 'Stop download failed',
    settings: 'Settings',
    simulation: 'Simulation',
    control: 'Control',
    manualInstall: 'Installed manually',
    stop: 'Stop',
    install: 'Install',
    version: 'Version',
    startSuccess: '{name} started',
    startFailed: '{name} failed: {msg}',
    controlStarted: '{name} control script started',
    controlFailed: '{name} control failed: {msg}',
    tfGenerating: 'Generating TF tree...',
    pdfOpenFailed: 'Failed to open PDF',
    tfOpened: 'TF tree generated and opened',
    tfPdfNotFound: 'Generated PDF not found',
    tfFailed: 'Generate TF tree failed',
    viewTfFailed: 'View TF failed: {msg}',
    rqtStartFailed: 'Failed to launch rqt. Ensure ROS and rqt installed.',
    rqtStarted: 'rqt launched',
    rvizStartFailed: 'Failed to launch rviz. Ensure ROS and rviz installed.',
    rvizStarted: 'rviz launched'
  },
  envManager: {
    title: 'Environment Manager',
    fetchFailed: 'Failed to fetch environments',
    getLatest: 'Get Latest',
    refreshStatus: 'Refresh Status',
    current: 'Current',
    recommended: 'Recommended',
    version: 'Version',
    installed: 'Installed',
    notInstalled: 'Not Installed',
    install: 'Install'
  }
  ,
  welcome: {
    title: 'Welcome to FutureDrive',
    subtitle: 'Connect · Control · Debug · Visualize, a one-stop AD workflow solution',
    openProject: 'Open Project',
    newProject: 'New Project',
    recentTitle: 'Recently Opened Projects',
    clearRecent: 'Clear recent list',
    noRecent: 'No recent projects',
    company: 'Anhui Lingyuan Robotics Technology Co., Ltd.'
  },
  about: {
    modalTitle: 'About FutureDrive',
    productTitle: 'FutureDrive Autonomous Driving',
    versionFree: 'Version {version} Free',
    checkUpdate: 'Check for Updates',
    teamLabel: 'Team: ',
    teamValue: 'FutureDrive Team',
    companyLabel: 'Company: ',
    companyValue: 'Anhui Lingyuan Robotics Technology Co., Ltd.',
    contactLabel: 'Contact: ',
    contactValue: 'xautomove@foxmail.com',
    license: 'License',
    licenseTip: 'View license',
    legal: 'Legal Disclaimer',
    legalTip: 'View legal statement',
    downloading: 'Downloading...',
    downloadProgress: 'Progress: {percent}%',
    downloadDone: 'Download completed',
    downloadFailed: 'Download failed: {msg}',
    checkingUpdate: 'Checking for updates...',
    noReleaseInfo: 'No release info found',
    isLatest: 'Already up to date',
    noInstaller: 'No installer found',
    newVersionTitle: 'New version available',
    newVersionContent: 'Detected new version v{version}. Download now?',
    download: 'Download',
    cancel: 'Cancel',
    checkFailed: 'Check for updates failed: {msg}'
  },
  rostopic: {
    modalTitle: 'Topics',
    refreshTitle: 'Refresh topic list',
    recordTitle: 'Record',
    playbackTitle: 'Play ROS bag',
    restartTitle: 'Restart ROS',
    restartDesc: 'This will terminate all ROS nodes and restart the Daemon. Continue?',
    restartBtnTitle: 'Restart ROS',
    searchPlaceholder: 'Search topics...',
    savePathPlaceholder: 'Save path, e.g. /tmp/rosbag',
    recordConfirm: 'Confirm Record',
    recordingStarting: 'Starting recording...',
    recordStop: 'Stop Recording',
    cancel: 'Cancel',
    fetchFailed: 'Failed to fetch topics: {msg}',
    copySuccess: 'Copied to clipboard',
    copyFailed: 'Copy failed',
    choosePathWarn: 'Please choose a save path',
    chooseTopicWarn: 'Select at least one topic',
    recordingStarted: 'Recording started',
    fileExists: 'File already exists: {path}',
    fileExistsGeneric: 'File already exists',
    recordStartFailed: 'Failed to start recording: {msg}',
    selectDirFailed: 'Select directory failed: {msg}',
    daemonStartFailed: 'Failed to start daemon: {msg}',
    restartSuccess: 'ROS restarted',
    restartFailed: 'Restart ROS failed: {msg}',
    stopRecordFailed: 'Stop recording failed',
    contextView: 'View',
    contextCopy: 'Copy'
  },
  rosbag: {
    selectFileFail: 'Select file failed: {msg}',
    getInfoFail: 'Get bag info failed: {msg}',
    mustChooseFile: 'Please choose a ROS bag file first',
    playDone: 'ROS bag playback completed',
    playStart: 'Start playing ROS bag',
    playStartFail: 'Start playback failed: {msg}',
    playStopped: 'Playback stopped',
    playStopFail: 'Stop playback failed: {msg}',
    pathPlaceholder: 'Choose a ROS bag file',
    chooseFile: 'Choose file',
    loadingInfo: 'Loading bag info...',
    labelFiles: 'Files: ',
    labelSize: 'Size: ',
    labelDuration: 'Duration: ',
    labelStart: 'Start: ',
    labelEnd: 'End: ',
    labelMessages: 'Messages: ',
    labelTopicInfo: 'Topic info: ',
    play: 'Play',
    stop: 'Stop'
  },
  projectModal: {
    title: 'New Project',
    name: 'Project Name',
    nameRequired: 'Please enter project name',
    namePattern: 'Only letters, numbers, underscore and hyphen are allowed',
    description: 'Project Description',
    descriptionPlaceholder: 'Enter project description',
    saveLocation: 'Project Save Location',
    chooseSaveLocation: 'Please choose save location',
    browse: 'Browse',
    cancel: 'Cancel',
    create: 'Create Project',
    dirExists: 'Project directory already exists',
    createSuccess: 'Project created',
    openFailed: 'Open project failed',
    fillNameWarn: 'Please fill in project name first',
    selectDirFail: 'Select directory failed',
    createFail: 'Create project failed'
  }
  ,
  fileEditor: {
    saveBtn: 'Save (Ctrl+S)',
    saveSuccess: 'Saved',
    saveFailed: 'Save failed: {msg}'
  },
  debugConsole: {
    title: 'Output Console',
    searchPlaceholder: 'Search logs...',
    scrollLockOn: 'Unlock scroll',
    scrollLockOff: 'Lock scroll',
    clear: 'Clear',
    filter: 'Filter',
    filterAll: 'All',
    filterInfo: 'Info',
    filterWarning: 'Warning',
    filterError: 'Error',
    copySuccess: 'Copied to clipboard',
    copyFailed: 'Copy failed',
    exportAll: 'Export all logs'
  },
  simulationSettings: {
    title: 'Simulation Settings - {platform}',
    host: 'Host',
    port: 'Port',
    map: 'Map',
    launchFile: 'Launch File',
    chooseFile: 'Choose File',
    chooseFileTitle: 'Choose launch file',
    chooseFilePlaceholder: 'Choose py or sh file',
    chooseFileOptionalPlaceholder: 'Choose py or sh file (optional)',
    onlyPySh: 'Only py or sh files allowed',
    launchArgs: 'Launch Args',
    launchArgsPlaceholder: 'Optional, appended to command, e.g., --foo bar',
    uninstall: 'Uninstall',
    pluginDir: 'Plugins Dir',
    cancel: 'Cancel',
    save: 'Save',
    validateHost: 'Please input Host',
    validatePort: 'Please input Port',
    validateMap: 'Please input Map',
    validateChooseFile: 'Please choose launch file'
  }
  ,
  templateManager: {
    title: 'Template Manager',
    market: 'Market',
    importTemplate: 'Import Template',
    loadFailed: 'Failed to load templates',
    applied: 'Applied template: {name}',
    applyFailed: 'Apply template failed: {msg}',
    fileExistsTitle: 'File exists',
    fileExistsContent: 'Template "{name}" exists, overwrite?',
    overwrite: 'Overwrite',
    cancel: 'Cancel',
    importFailedX: 'Import template failed: {msg}',
    importSuccess: 'Template imported',
    apply: 'Apply'
  },
  mapEditor: {
    importPCD: 'Import PCD file',
    drawLine: 'Draw line tool',
    drawPolygon: 'Draw polygon tool',
    addPoint: 'Add point tool',
    deleteTool: 'Delete tool',
    undoTool: 'Undo tool',
    choosePCDTitle: 'Choose PCD file',
    pcdFilterName: 'PCD Files',
    fileImportFailed: 'File import failed',
    importPCDFailed: 'Import PCD failed: {msg}',
    invalidPointCloud: 'Invalid point cloud data',
    noPointsAfterFilter: 'No points after filter',
    loadSuccess: 'Point cloud loaded',
    loadFailed: 'Load point cloud failed',
    drawFailed: 'Draw failed: canvas or camera missing',
    layersTitle: 'Layers',
    propertiesTitle: 'Properties',
    id: 'ID',
    type: 'Type',
    lane: 'Lane',
    park: 'Parking',
    junction: 'Junction',
    speedLimit: 'Speed Limit',
    direction: 'Direction',
    forward: 'Forward',
    backward: 'Backward',
    both: 'Both'
  },
  hardwareManager: {
    addDevice: 'Add Device',
    editDevice: 'Edit Device',
    okAdd: 'Add Device',
    okSave: 'Save',
    cancel: 'Cancel',
    tabSensor: 'Sensor',
    tabOther: 'Other',
    name: 'Device Name',
    nameRequired: 'Please enter device name',
    model: 'Device Model',
    modelRequired: 'Please choose model',
    modelPlaceholder: 'Choose device model',
    modelOther: 'Other',
    topic: 'Topic',
    enabled: 'Enabled',
    remark: 'Remark',
    driverScript: 'Driver Script',
    selectDir: 'Choose dir',
    selectDirPlaceholder: 'Choose directory',
    listRoot: 'Devices',
    listSensors: 'Sensors',
    listOthers: 'Other Devices',
    confirmDelete: 'Confirm delete',
    confirmDeleteContent: 'Delete device "{name}"?',
    ok: 'OK',
    needOpenProject: 'Please open a project first',
    deleteSuccess: 'Deleted',
    deleteFailed: 'Delete failed',
    initFailed: 'Initialize hardware config failed',
    addSuccess: 'Device added',
    updateSuccess: 'Device updated',
    addUpdateFailed: '{mode} device failed: {msg}'
  },
  topicEcho: {
    title: 'Topic: {topic}',
    modeEcho: 'Echo',
    modeDelay: 'Delay',
    modeHz: 'Hz',
    modeInfo: 'Info',
    modeType: 'Type',
    filterPlaceholder: 'Filter...',
    autoScroll: 'Auto Update',
    export: 'Export',
    exportSuccess: 'Exported',
    fetchFailed: 'Fetch failed'
  }
  ,
  nodeConfig: {
    modalTitle: 'Node Config - {label}',
    selectFileTitle: 'Choose {name} file',
    fileFilterAll: 'All Files',
    filePlaceholder: 'Choose a file...',
    chooseFile: 'Choose File'
  },
  nodeList: {
    title: 'Available Nodes',
    tabAll: 'All',
    openDir: 'Open node directory',
    refresh: 'Refresh node list',
    market: 'Market',
    searchPlaceholder: 'Search nodes...',
    add: 'Add',
    refreshSuccess: 'Node list refreshed',
    refreshFailed: 'Refresh failed'
  },
  main: {
    initializing: 'Initializing...',
    runStopped: 'Flow stopped',
    runStopFailed: 'Stop failed: {msg}',
    enableRedisWarn: 'Enable Redis cache in settings first',
    redisDisabledWarning: 'Enable Redis cache in settings first',
    noExecutable: 'No executable nodes',
    startFlow: 'Starting flow...',
    runFailed: 'Flow failed',
    copied: 'Node copied',
    pasted: 'Node pasted',
    noPasteNode: 'No node to paste',
    setPriority: 'Set Priority',
    priorityHint: 'Enter priority (larger number = higher priority):',
    invalidNumber: 'Enter a valid number',
    toolbar: {
      expanding: 'Expand toolbar',
      collapsing: 'Collapse toolbar',
      expand: 'Expand toolbar',
      collapse: 'Collapse toolbar',
      starting: 'Starting...',
      stop: 'Stop',
      run: 'Run Flow',
      templates: 'Templates',
      templateManager: 'Templates',
      exportTpl: 'Export Template',
      exportTemplate: 'Export Template',
      autoLayout: 'Auto Layout',
      clearCanvas: 'Clear Canvas',
      addNode: 'Add Node'
    },
    export: {
      cannot: 'Cannot export template',
      cannotDesc: 'No nodes on canvas. Add nodes first.',
      ok: 'OK',
      title: 'Export Template',
      inputName: 'Enter template name:',
      inputPlaceholder: 'Enter template name',
      cancel: 'Cancel',
      exists: 'File exists',
      existsDesc: 'Template "{name}" exists. Overwrite?',
      overwrite: 'Overwrite',
      successTitle: 'Exported',
      successDesc: 'Template exported successfully.',
      failedTitle: 'Export failed',
      failedDesc: 'Error exporting template: {msg}'
    },
    exportTemplate: {
      cannotExportTitle: 'Cannot export template',
      noNodesWarning: 'No nodes on canvas. Add nodes first.',
      exportTitle: 'Export Template',
      inputTemplateName: 'Enter template name:',
      templateNamePlaceholder: 'Enter template name',
      templateNameRequired: 'Please enter template name',
      exportSuccess: 'Template exported successfully',
      exportFailed: 'Export template failed: {msg}',
      fileExists: 'File exists',
      fileExistsDesc: 'Template "{name}" exists. Overwrite?'
    },
    bgExitTitle: 'Exit background process',
    bgExitContent: 'Exit background process now?',
    logs: {
      killedPg: 'Killed background process group (PGID: {pgid})',
      killedPid: 'Killed background process (PID: {pid})',
      notFoundRunningPgids: 'No running background PIDs found',
      notFoundPid: 'Background PID not found',
      bgKillError: 'Error killing background process: {msg}',
      openConfig: 'Open config',
      addNode: 'Add node',
      addTaskNode: 'Add task node',
      connectTypeMismatch: 'Connect failed: type mismatch ({src} -> {dst})',
      guiInitFailed: 'GUI init failed: {msg}',
      flowStopped: 'Flow stopped',
      stopFlowError: 'Stop flow failed',
      noNodesToRun: 'No nodes to run',
      flowStarting: 'Flow starting...',
      flowExecutionError: 'Flow execution failed',
      guiInitError: 'GUI init failed',
      connectionFailedTypeMismatch: 'Connect failed: type mismatch'
    },
    clear: {
      title: 'Clear Canvas',
      content: 'Clear current canvas? This cannot be undone.'
    },
    autoLayoutTitle: 'Auto Layout',
    autoLayoutContent: 'Apply auto layout to the current canvas?',
    clearCanvasTitle: 'Clear Canvas',
    clearCanvasContent: 'Clear current canvas? This cannot be undone.',
    nodeInfoTitle: 'Node Info',
    noneIntro: 'No description',
    noDescription: 'No description',
    menu: {
      add: 'Add Node',
      copy: 'Copy Node',
      paste: 'Paste Node',
      delete: 'Delete Node',
      priority: 'Set Priority',
      info: 'View Info',
      viewLog: 'View Logs'
    },
    nodeToolbar: {
      settings: 'Settings',
      setColor: 'Set Color',
      deleteNode: 'Delete Node',
      bgRunningTip: 'Background running, click to stop',
      addNode: 'Add Node',
      copyNode: 'Copy Node',
      pasteNode: 'Paste Node',
      setPriority: 'Set Priority',
      viewInfo: 'View Info',
      viewLog: 'View Logs',
      nodeInfo: 'Node Info',
      nodeCopied: 'Node copied',
      nodePasted: 'Node pasted',
      noNodeToPaste: 'No node to paste'
    }
  },
  nodeLog: {
    title: 'Node Run Logs',
    empty: 'No logs for this node',
    close: 'Close',
    tabs: {
      status: 'Status',
      input: 'Input',
      output: 'Output',
      config: 'Config',
      debug: 'Debug'
    },
    copySuccess: 'Copied',
    copyFailed: 'Copy failed',
    copyStatusTitle: 'Copy status',
    status: 'Status:',
    statusCompleted: 'Completed',
    statusError: 'Error',
    statusUnknown: 'Unknown',
    startTime: 'Start:',
    endTime: 'End:',
    duration: 'Duration:',
    nodeName: 'Node:',
    uuid: 'UUID:',
    recordTime: 'Record Time:',
    none: 'None'
  },
  installExt: {
    title: 'Install Extension',
    inputPlaceholder: 'Enter install command',
    select: {
      node: 'Node',
      template: 'Template',
      plugin: 'Plugin',
      driver: 'Driver'
    },
    install: 'Install',
    market: 'Market',
    openMarket: 'Open Market',
    logTitle: 'Logs:'
  }
};

export default en;


